import { ref } from 'vue'
import { post, get } from '../utils/request'
import { SM2_PUBLIC_KEY } from '../config/index.js'

// 当前登录状态和token管理
const isLoggedIn = ref(false)
const userInfo = ref(null)
const token = ref('')

// token存储键名
const TOKEN_KEY = 'satoken'
const TOKEN_EXPIRE_KEY = 'satoken_expire'

// token存储时间配置（单位：天）
const TOKEN_EXPIRE_DAYS = 30

// 获取token
const getToken = () => {
  if (!token.value) {
    // 从localStorage获取token
    token.value = localStorage.getItem(TOKEN_KEY) || ''
    
    // 检查token是否过期
    const expireTime = localStorage.getItem(TOKEN_EXPIRE_KEY)
    if (expireTime && Date.now() > parseInt(expireTime)) {
      console.log('检测到token已过期，清除token')
      clearToken()
      return ''
    }
  }
  return token.value
}

// 设置token
const setToken = (newToken) => {
  token.value = newToken
  localStorage.setItem(TOKEN_KEY, newToken)
  
  // 设置token过期时间（30天后）
  const expireTime = Date.now() + (TOKEN_EXPIRE_DAYS * 24 * 60 * 60 * 1000)
  localStorage.setItem(TOKEN_EXPIRE_KEY, expireTime.toString())
  console.log(`Token已设置，将在${TOKEN_EXPIRE_DAYS}天后过期`)
}

// 清除token
const clearToken = () => {
  token.value = ''
  localStorage.removeItem(TOKEN_KEY)
  localStorage.removeItem(TOKEN_EXPIRE_KEY)
  console.log('Token已清除')
}

// 加载 sm-crypto 库
let sm2 = null

// 动态导入 sm-crypto
const loadSmCrypto = async () => {
  if (!sm2) {
    const smCrypto = await import('sm-crypto')
    sm2 = smCrypto.sm2
  }
  return sm2
}

// SM2 加密密码
const encryptPassword = async (password) => {
  try {
    const sm2 = await loadSmCrypto()
    return sm2.doEncrypt(password, SM2_PUBLIC_KEY)
  } catch (error) {
    console.error('SM2 加密失败:', error)
    throw new Error('密码加密失败')
  }
}

// 登录接口
const login = async (account, password) => {
  try {
    // 加密密码
    const encryptedPassword = await encryptPassword(password)

    // 使用拦截器发送请求 - satoken会自动处理认证
    const result = await post('/auth/b/doLogin', {
      account: account,
      password: encryptedPassword
    })

    if (result.success) {
      // 登录成功 - 保存token并设置登录状态
      console.log('登录成功，返回数据:', result)
      
      // 从响应数据中获取token - 后端返回的token在data字段中
      const responseToken = result.data || ''
      
      if (responseToken) {
        setToken(responseToken)
        console.log('Token已保存:', responseToken)
      } else {
        console.warn('登录成功但未返回token，检查后端接口')
      }
      
      isLoggedIn.value = true
      
      return {
        success: true,
        message: result.message || '登录成功',
        token: responseToken
      }
    } else {
      return {
        success: false,
        message: result.message || '登录失败'
      }
    }
  } catch (error) {
    console.error('登录请求失败:', error)
    return {
      success: false,
      message: '网络错误，请检查网络连接'
    }
  }
}

// 获取用户信息
const getUserInfo = async () => {
  try {
    // 使用拦截器发送请求 - satoken会自动处理认证
    const result = await get('/auth/b/getLoginUser')

    if (result.success) {
      userInfo.value = result.data
      return {
        success: true,
        data: result.data
      }
    } else {
      return {
        success: false,
        message: result.message || '获取用户信息失败'
      }
    }
  } catch (error) {
    console.error('获取用户信息失败:', error)
    return {
      success: false,
      message: '网络错误，请检查网络连接'
    }
  }
}

// 检查登录状态 - 简化为检查用户信息接口
const checkLoginStatus = async () => {
  try {
    // 直接调用获取用户信息接口，satoken会自动处理认证
    // 如果接口返回401，拦截器会自动跳转到登录页
    const result = await getUserInfo()
    
    if (result.success) {
      isLoggedIn.value = true
      return true
    } else {
      isLoggedIn.value = false
      return false
    }
  } catch (error) {
    console.error('检查登录状态失败:', error)
    isLoggedIn.value = false
    return false
  }
}

// 退出登录
const logout = () => {
  // 调用后端退出接口
  get('/auth/b/doLogout').catch(error => {
    console.error('退出登录请求失败:', error)
  })

  // 清除本地状态和token
  isLoggedIn.value = false
  userInfo.value = null
  clearToken()
}

// 通过旧密码修改密码
const updatePasswordByOld = async (oldPassword, newPassword) => {
  try {
    // 加密旧密码和新密码
    const encryptedOldPassword = await encryptPassword(oldPassword)
    const encryptedNewPassword = await encryptPassword(newPassword)

    // 使用拦截器发送请求 - satoken会自动处理认证
    // 根据后端代码，正确路径是 /sys/userCenter/updatePasswordByOld
    // 注意：后端参数名是 password（旧密码）和 newPassword（新密码）
    const result = await post('/sys/userCenter/updatePasswordByOld', {
      password: encryptedOldPassword,
      newPassword: encryptedNewPassword
    })

    if (result.success) {
      return {
        success: true,
        message: result.message || '密码修改成功'
      }
    } else {
      return {
        success: false,
        message: result.message || '密码修改失败'
      }
    }
  } catch (error) {
    console.error('修改密码请求失败:', error)
    return {
      success: false,
      message: '网络错误，请检查网络连接'
    }
  }
}

export {
  isLoggedIn,
  userInfo,
  login,
  logout,
  getUserInfo,
  checkLoginStatus,
  getToken,
  setToken,
  clearToken,
  updatePasswordByOld
}
